namespace dotnet_ef_admin.Src.Services;

/// <summary>
/// 定义了DictService接口，该接口规定了DictService必须实现的方法。
/// DictService负责为Dict模型提供增删改查操作。
/// </summary>
public interface IDictService {
    /// <summary>
    /// 异步从数据库中获取所有字典。
    /// </summary>
    /// <param name="dto">用于查询的DTO对象。</param>
    /// <returns>表示异步操作的Task，Task结果包含一个IEnumerable的字典集合。</returns>
    Task<GetAllDictsResult> FindAllAsync(FindAllDictsDto dto);

    /// <summary>
    /// 异步从数据库中根据ID获取字典。
    /// </summary>
    /// <param name="id">要获取的字典的ID。</param>
    /// <returns>表示异步操作的Task，Task结果包含找到的字典（如果找到），否则为null。</returns>
    Task<DictEntryResult?> FindFormAsync(int id);

    /// <summary>
    /// 异步在数据库中创建一个新的字典。
    /// </summary>
    /// <param name="dict">表示要创建的字典的Dict对象。</param>
    /// <returns>表示异步操作的Task，Task结果包含创建的字典。</returns>
    Task<DictEntryResult> CreateAsync(DictEntry dict);

    /// <summary>
    /// 异步在数据库中更新现有的字典。
    /// </summary>
    /// <param name="id">要更新的字典的ID。</param>
    /// <param name="dict">表示要更新的字典的Dict对象。</param>
    /// <returns>表示异步操作的Task，Task结果包含更新后的字典。</returns>
    Task<DictEntryResult> UpdateAsync(int id, DictEntryResult dict);

    /// <summary>
    /// 异步在数据库中删除多个字典。
    /// </summary>
    /// <param name="ids">要删除的字典的ID数组。</param>
    /// <returns>表示异步操作的Task，Task结果包含删除操作的影响数量。</returns>
    Task<int> DeleteManyAsync(int[] ids);
}

public class FindAllDictsDto {
    /// <summary>
    /// 关键词，用于搜索。
    /// </summary>
    public string? Keywords { get; set; } = "";

    /// <summary>
    /// 当前页码，默认为1。
    /// </summary>
    public int? PageNum { get; set; } = 1;

    /// <summary>
    /// 每页显示的数量，默认为10。
    /// </summary>
    public int? PageSize { get; set; } = 10;
}

/// <summary>
/// 表示一个字典。
/// </summary>
public class DictEntry {
    /// <summary>
    /// 名称。
    /// </summary>
    public required string Name { get; set; }

    /// <summary>
    /// 编码。
    /// </summary>
    public required string Code { get; set; }

    /// <summary>
    /// 状态。
    /// </summary>
    public int Status { get; set; }

    /// <summary>
    /// 字典项列表。
    /// </summary>
    public List<DictItem>? DictItems { get; set; }
}

public class DictEntryResult : DictEntry {
    /// <summary>
    /// 字典的唯一标识符。
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// 字典项列表。
    /// </summary>
    public new List<DictItemResult>? DictItems { get; set; }
}

/// <summary>
/// 表示字典项。
/// </summary>
public class DictItem {
    /// <summary>
    /// 排序。
    /// </summary>
    public int Sort { get; set; }

    /// <summary>
    /// 状态。
    /// </summary>
    public int Status { get; set; }

    /// <summary>
    /// 名称。
    /// </summary>
    public required string Name { get; set; }

    /// <summary>
    /// 值。
    /// </summary>
    public required string Value { get; set; }
}

public class DictItemResult : DictItem {
    /// <summary>
    /// 字典项的唯一标识符。
    /// </summary>
    public int Id { get; set; }
}

public class GetAllDictsResult {
    /// <summary>
    /// 总计数量。
    /// </summary>
    public int Total { get; set; }

    /// <summary>
    /// 字典列表。
    /// </summary>
    public IEnumerable<DictEntryResult> List { get; set; } = [];
}